package com.hxh.generater.common.remote;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.hxh.entity.Project;
import com.hxh.entity.ProjectTablePageConfig;
import com.hxh.entity.output.ApiResult;
import com.hxh.entity.po.ClassInfo;
import com.hxh.util.GenUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Data
public class VueRemoteUtil {
    private Project project;
    private ClassInfo classInfo;
    private boolean writeFile;

    //远程接口地址后缀
    private String remoteUrlSuffix;
    //写入文件路径
    private String writeFilePath;
    //写入文件名
    private String writeFileName;

    /**
     * 默认流程
     *
     * @return
     * @throws IOException
     */
    public String process() throws IOException {
        Map<String, Object> params = new HashMap<>();
        params.put("classInfo", JSONUtil.toJsonStr(classInfo));
        String mutilDatasourceStr = GenUtil.getMutilDatasourceStr(project, classInfo);
        params.put("mutilDatasourceStr", mutilDatasourceStr);
        ApiResult apiResult = RemoteUtil.getCodeFromRemote(project, remoteUrlSuffix, params);
        Map<String, Object> data = (Map<String, Object>) apiResult.getData();
        if (data == null) {
            log.warn("远程接口返回数据为空：" + apiResult.getMessage());
            return null;
        }
        String code = (String) data.get("code");
        if (writeFile) {
            File classFile = GenUtil.newVueFile(project, writeFilePath, writeFileName);
            RemoteUtil.writeFileToProject(code, classFile);
        }
        return code;
    }

    /**
     * 检查是否需要处理添加方法
     *
     * @param projectTablePageConfig 项目表格页面配置对象
     * @return 如果需要生成add方法则返回true，否则返回false
     */
    public static boolean checkNeedProcessAddMethod(ProjectTablePageConfig projectTablePageConfig) {
        // 检查配置对象是否为空
        boolean flag = projectTablePageConfig != null;
        if (flag) {
            // 获取添加显示配置和添加字段配置
            String showAdd = projectTablePageConfig.getShowAdd();
            String addFields = projectTablePageConfig.getAddFields();
            // 判断是否需要显示添加功能且添加字段不为空
            flag = "1".equals(showAdd) && StrUtil.isNotBlank(addFields);
        }
        if (!flag) {
            log.warn("不需要生成add方法");
        }
        return flag;
    }


    /**
     * 检查是否需要处理编辑方法
     *
     * @param projectTablePageConfig 项目表页面配置对象
     * @return 如果需要生成update方法则返回true，否则返回false
     */
    public static boolean checkNeedProcessEditMethod(ProjectTablePageConfig projectTablePageConfig) {
        boolean flag = projectTablePageConfig != null;
        if (flag) {
            String showUpdate = projectTablePageConfig.getShowUpdate();
            String updateFields = projectTablePageConfig.getUpdateFields();
            // 检查是否显示更新功能且更新字段不为空
            flag = "1".equals(showUpdate) && StrUtil.isNotBlank(updateFields);
        }
        if (!flag) {
            log.warn("不需要生成update方法");
        }
        return flag;
    }


}
